package com.interview.three;

import lombok.extern.slf4j.Slf4j;

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.util.ArrayList;

/**
 * 弱引用：来做一些，在对象被回收的同时，要清除对象的其他资源
 */
@Slf4j
public class TestPhantomRef {
    public static void main(String[] args) throws InterruptedException {
        ReferenceQueue<String> queue = new ReferenceQueue<>();
        ArrayList<MyResource> list = new ArrayList<>(3);
        list.add(new MyResource(new String("a"),queue));
        // 若不是对象，因为 不是new 的话，就是常量池种的，故不会被回收
        list.add(new MyResource("b",queue));
        list.add(new MyResource(new String("c"),queue));
        System.gc();
        Thread.sleep(1000);
        
        Object ret;
        while ((ret = queue.poll())!=null){
            if (ret instanceof MyResource){
                ((MyResource)ret).clean();
            }
        }
    }
    
    @Slf4j
    static class MyResource extends PhantomReference<String>{

        public MyResource(String referent, ReferenceQueue<? super String> q) {
            super(referent, q);
        }
        public void clean(){
            log.info("----clean---");
        }
    }
}
